package com.lonely.entity.bash;

import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

/**
 * @date: 2021-11-02 11:26
 * @author: ztkj-hzb
 * @description: 支付dao
 **/
@Data
public class Result<T> implements Serializable {


    /**
     * 随机id
     */
    private String requestId;

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 响应消息
     */
    private String msg;


    /**
     * 返回标准成功格式
     *
     * @param data
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(T data) {
        return resultData(ResultCode.SUCCESS.code, ResultCode.SUCCESS.msg, data);
    }

    /**
     * 自定义展示内容成功格式
     *
     * @param data
     * @param msg
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(T data, String msg) {
        return resultData(ResultCode.SUCCESS.code, msg, data);
    }

    /**
     * 标准异常格式
     *
     * @param msg
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(String msg) {
        return fail(ResultCode.ERROR.code, msg, null);
    }

    /**
     * 标准异常格式
     *
     * @param msg
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(T data, String msg) {
        return resultData(ResultCode.ERROR.code, msg, data);
    }

    /**
     * 标准异常格式
     *
     * @param code
     * @param msg
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(Integer code, String msg) {
        return resultData(code, msg, null);
    }

    /**
     * 自定义展示内容异常格式
     *
     * @param code
     * @param msg
     * @param data
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(Integer code, String msg, T data) {
        return resultData(code, msg, data);
    }

    /**
     * 组装返回对象
     *
     * @param code
     * @param msg
     * @param data
     * @param <T>
     * @return
     */
    private static <T> Result<T> resultData(Integer code, String msg, T data) {
        Result<T> resultData = new Result<>();
        resultData.setRequestId(UUID.randomUUID().toString());
        resultData.setCode(code);
        resultData.setMsg(msg);
        resultData.setData(data);
        return resultData;
    }


    /**
     * 结果code
     */
    public enum ResultCode {

        /**
         * 标准成功
         */
        SUCCESS(100, "SUCCESS"),

        /**
         * 标准失败
         */
        ERROR(101, "FAIL");

        /**
         * 状态码
         */
        public Integer code;

        /**
         * 显示内容
         */
        public String msg;

        ResultCode(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    }
}
